package com.example.shopp_2301.car

import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.core.view.isVisible
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.alibaba.android.arouter.launcher.ARouter
import com.blankj.utilcode.util.ToastUtils
import com.example.base.entity.OrderDetail
import com.example.base.entity.ParamPreOrder
import com.example.base.mvvm.BaseFragment
import com.example.shopp_2301.R
import com.example.shopp_2301.adapter.CarAdapter
import com.example.shopp_2301.databinding.FragmentCarBinding


class CarFragment : BaseFragment<FragmentCarBinding,CarViewModel>() {
    lateinit var carAdapter: CarAdapter
    override fun initView() {
        carAdapter = CarAdapter()
        binding.rvCar.adapter = carAdapter
        binding.rvCar.layoutManager = LinearLayoutManager(context)

        viewModel.car("true","10","1")
        //点击item上的控件
        carAdapter.addChildClickViewIds(R.id.car_cb,R.id.car_image,R.id.car_add,R.id.car_sub)
        carAdapter.setOnItemChildClickListener { adapter, view, position ->
            when(view.id){
                R.id.car_cb->{
                    //点击复选框----数据层面 变为原来的相反值  页面层面  会自动发生变化无需操作  接口层面  不需操作
                    carAdapter.data[position].isCheck = !carAdapter.data[position].isCheck
                }
                R.id.car_image->{
                    //跳转详情
                    ARouter.getInstance().build("/app/XqActivity").withInt("goodsId",carAdapter.data[position].productId).navigation()
                }
                R.id.car_add->{
                    //点击加号 ---- 数据层面 变成为原来的数据+1   页面层面  数据变为原来数据+1  接口层面 需要调用接口  （*****该数据的选中状态不能发生变化,不能进行刷新操作） 、
                    carAdapter.data[position].cartNum++
                    (carAdapter.getViewByPosition(position,R.id.car_num) as TextView).text = "${carAdapter.data[position].cartNum}"
                    //调用接口
                    viewModel.update(carAdapter.data[position].id,carAdapter.data[position].cartNum)
                    //减号变成了可用状态
                    (carAdapter.getViewByPosition(position,R.id.car_sub) as TextView).isEnabled = true
                }
                R.id.car_sub->{
                    //点击加号 ---- 数据层面 变成为原来的数据+1   页面层面  数据变为原来数据+1  接口层面 需要调用接口  （*****该数据的选中状态不能发生变化,不能进行刷新操作） 、
                    carAdapter.data[position].cartNum--
                    (carAdapter.getViewByPosition(position,R.id.car_num) as TextView).text = "${carAdapter.data[position].cartNum}"
                    //调用接口
                    viewModel.update(carAdapter.data[position].id,carAdapter.data[position].cartNum)
                    //减号变成了可用状态
                    if(carAdapter.data[position].cartNum==1){
                        (carAdapter.getViewByPosition(position,R.id.car_sub) as TextView).isEnabled = false
                    }

                }
            }
            //点击事件中触发  ---统计金额 和选中状态
            checkAll()
        }
        binding.cbAll.setOnCheckedChangeListener { buttonView, b ->
            binding.cbAll.setOnClickListener {
                //当前值变成原来的相反值(由上方监听事件完成) //将上方数据的选中状态变成和cbAll一致  刷新下方合计金额
                carAdapter.data.forEach {
                    it.isCheck = b
                }
                carAdapter.notifyDataSetChanged()
                checkAll()
            }
        }

        //点击管理 文字变成取消同时取消布局显示  管理布局隐藏   再次点击 文字变回管理  同是 取消布局隐藏  管理布局显示
        binding.tvManage.setOnClickListener {
            if(binding.tvManage.text=="管理"){
                binding.tvManage.text = "取消"
                binding.clCancel.isVisible = true
                binding.clManage.isVisible = false
            }else{
                binding.tvManage.text = "管理"
                binding.clCancel.isVisible = false
                binding.clManage.isVisible = true
            }
        }
        //点击删除文字，实现将选中的商品删除//当没有选中商品时，给出提示
        binding.tvDelete.setOnClickListener {
            val list = mutableListOf<Boolean>()
            carAdapter.data.forEach {
                list.add(it.isCheck)
            }
            if(true in list){
                //有选中的，那么我们循环获取id
                var ids = arrayOf<Int>()
                carAdapter.data.forEach {
                    if(it.isCheck){
                        ids+=it.id
                    }
                }
                viewModel.delete(ids)

            }else{
                ToastUtils.showLong("至少选中一种商品")
            }
        }
        //注   在管理页面左滑删除，不能影响其他数据的状态
        ItemTouchHelper(object :ItemTouchHelper.Callback(){
            override fun getMovementFlags(
                recyclerView: RecyclerView,
                viewHolder: RecyclerView.ViewHolder
            ): Int {
                //获取滑动标识
                val left = ItemTouchHelper.LEFT
                return makeMovementFlags(0,left)
            }

            override fun onMove(
                recyclerView: RecyclerView,
                viewHolder: RecyclerView.ViewHolder,
                target: RecyclerView.ViewHolder
            ): Boolean {
                return true
            }

            override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
                //滑动后执行
                val position = viewHolder.layoutPosition
                viewModel.delete(arrayOf(carAdapter.data[position].id))
                //页面移除
                carAdapter.data.removeAt(position)
                //页面局部刷新
                carAdapter.notifyItemRemoved(position)
                checkAll()//可能会影响合计金额
            }
        }).attachToRecyclerView(binding.rvCar)

        //点击立即购买生成预下单
        binding.buyNow.setOnClickListener {
            val paramPreOrder = ParamPreOrder()
            //判断是否选中了商品
            val list = mutableListOf<Boolean>()
            carAdapter.data.forEach {
                list.add(it.isCheck)
            }
            if(true in list){
                //需要有下单方式 和下单商品详情
                paramPreOrder.preOrderType = "shoppingCart"
                //选中多个商品，需要将商品购物车id 放到对应的实体类中
                val orderDetails = mutableListOf<OrderDetail>()
                carAdapter.data.forEach {
                    if(it.isCheck){
                        val orderDetail = OrderDetail()
                        orderDetail.shoppingCartId = it.id
                        orderDetails.add(orderDetail)
                    }
                }
                paramPreOrder.orderDetails = orderDetails
                viewModel.preOrder(paramPreOrder)
            }else{
                ToastUtils.showLong("请至少选择一种商品")
            }

        }

    }

    private fun checkAll() {
        //计算金额
        var amount = 0f
        //循环数据，查看选中的进行累加
        carAdapter.data.forEach {
            if(it.isCheck){
                amount +=it.cartNum * it.price.toFloat()
            }
        }
        binding.amountAll.text = "合计:￥$amount"
        //判断是否全选
        //所有数据中存在未选中  就是未全选
        val list = mutableListOf<Boolean>()
        carAdapter.data.forEach {
            list.add(it.isCheck)
        }
        if(list.size>0){
            if(false in list){
                binding.cbAll.isChecked = false
            }else{
                binding.cbAll.isChecked = true
            }
        }else{
            binding.cbAll.isChecked = false
        }


    }

    override fun initData() {
        viewModel.carSuccess.observe(this){
            if(it.code==200){
                carAdapter.data.clear()
                carAdapter.data.addAll(it.data.list)
                carAdapter.notifyDataSetChanged()
            }
        }
        viewModel.updateSuccess.observe(this){
            ToastUtils.showLong(it.message)
        }
        viewModel.deleteSuccess.observe(this){
            ToastUtils.showLong(it.message)
            //viewModel.car("true","10","1")
        }
        viewModel.preSuccess.observe(this){
            if(it.code==200){
                ToastUtils.showLong(it.data.preOrderNo)
                ARouter.getInstance().build("/app/CreateOrderActivity").withString("preOrderNo",it.data.preOrderNo).navigation()
            }
        }
    }

    override fun getViewModel(): Class<CarViewModel> {
        return CarViewModel::class.java
    }

    override fun getLayout(): Int {
        return R.layout.fragment_car
    }

}